//
//  HomeTableViewController.swift
//  sinaWeibo
//
//  Created by liii on 16/6/20.
//  Copyright © 2016年 liii. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

// 重用标示符
private let homeCellId = "homeCellId"

class HomeTableViewController: BaseTableViewController {
    
    let refreshDown = ZJRefreshControl()
    
    // 模型数组
    var statuses = [Status]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 如果用户未登陆显示访客视图
        if !userLogin {
            showVisitorViewIfUserNotLogin()
            return
        }
        
        // 如果用户已登陆显示首页视图
        showHomeViewIfUserHasLogin()
        
        // 自定义下拉刷新
        self.tableView.addSubview(self.refreshDown)
        self.refreshDown.addTarget(self, action: "refreshData", forControlEvents: .ValueChanged)
        
        // 下拉刷新
//        downPullRefresh()
        
        // 上拉加载控件
        tableView.tableFooterView = indicatorView
        
        // 开启点击状态栏, 滚动到顶部功能
        tableView.scrollsToTop = true
        
        // 添加提示刷新试图
        self.navigationController?.navigationBar.addSubview(tipLabel)
        self.navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
        
//        // 定时刷新
//        NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "update", userInfo: nil, repeats: true)
    }
    
    // 实现下拉刷新
    private func downPullRefresh() {
    
        // 添加下拉刷新按钮
        refreshControl = UIRefreshControl()
        
        // 监听按钮, 下拉刷新的时候, 请求新数据, 并在最上边显示
        refreshControl?.addTarget(self, action: "refreshData", forControlEvents: .ValueChanged)
    }
    
    // 下拉刷新
    @objc private func refreshData() {
        // 开始刷新
        refreshControl?.beginRefreshing()
        // 获取最后更新的一条数据的id
        let since_id = self.statuses.first?.id ?? 0
        // 请求最新数据
        Status.loadHomeData(since_id) { (dict) -> () in
            // 拿到数据结束刷新
//            self.refreshControl?.endRefreshing()
            // 恢复状态
            self.refreshDown.endRefreshing()
            // 过滤dict为空的情况
            guard let list = dict else {
                SVProgressHUD.showErrorWithStatus(appErrorTip)
                return
            }
            // 把新数据添加到最前面
            self.statuses = list + self.statuses
            // 弹出刷新提示
            self.tipLabelAnimation(list.count)
            // 刷新表格
            self.tableView.reloadData()
        }
    }
    
    // 如果用户未登录
    private func showVisitorViewIfUserNotLogin() {

            // 就显示访客视图
            visitorView?.setVisitorWith("爱的世界发掘的弗拉健康的垃圾发垃圾袋阿拉丁是加法", imageName: nil)
    }
    
    // 如果用户已经登录
    private func showHomeViewIfUserHasLogin() {
        // 注册Cell
        registerHomeCell()
//        // 首次加载数据, 刷新界面
//        loadData()
    }
    // 发布微博控制器，被关闭的时候，会显示首页，接着会执行此方法
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
//        self.tabBarItem.badgeValue = "3"
        loadData()
    }

    // 注册Cell
    private func registerHomeCell() {

        /*
         * OC中获取Cell类型: [UITableViewCell class]
         * Swift中获取Cell类型: UITableViewCell.self
         * ? 代表如果tableView的值为nil, 后边的调用就不执行(用户未登录的时候, 视图为VisitorView, 认证成功之后, 视图才是tableView)
        */
        tableView.registerClass(StatusCell.self, forCellReuseIdentifier: homeCellId)
        // 预估行高 No.1
        tableView.estimatedRowHeight = 300
        // 固定行高 No.2
        tableView.rowHeight = UITableViewAutomaticDimension
        // 取消分隔线
        tableView.separatorStyle = .None
    }
    
    // 发送网络请求, 加载数据
    private func uploadData() {
        // 开始执行上拉加载更多动画
        indicatorView.startAnimating()
        // 获取第一个微博的id, 用来向前查找
        let max_id = self.statuses.last?.id ?? 0
        // 发送请求, 回调数据, max_id -1的作用是防止加载的数据重复, 因为接口所致
        Status.loadData(max_id - 1) { (dict) -> () in
            // 停止上拉加载更多动画
            self.indicatorView.stopAnimating()
            // 过滤dict为空的情况
            guard let list = dict else {
                SVProgressHUD.showErrorWithStatus(appErrorTip)
                return
            }
            // 存放到模型数组
            self.statuses += list
            print("目前共加载了\(self.statuses.count)条微博")
            // 刷新表格
            self.tableView.reloadData()
        }
    }
    
    // 发送网络请求, 加载数据
    private func loadData() {
        // 发送请求, 回调数据, max_id -1的作用是防止加载的数据重复, 因为接口所致
        Status.loadData { (dict) -> () in
            // 停止上拉加载更多动画
            self.indicatorView.stopAnimating()
            // 过滤dict为空的情况
            guard let list = dict else {
                SVProgressHUD.showErrorWithStatus(appErrorTip)
                return
            }
            // 存放到模型数组
            self.statuses = list
            // 刷新表格
            self.tableView.reloadData()
        }
    }
    
    // 添加动画
    private func tipLabelAnimation(count: Int) {
    
        let rect = tipLabel.frame
        let tipText = count == 0 ? "没有新微薄" : "有\(count)条新微薄"
        tipLabel.text = tipText
    
        // 执行下拉动画
        UIView.animateWithDuration(0.5, animations: { () -> Void in
            
            // 向下移动44
            self.tipLabel.frame = CGRectMake(0, 44, screenWidth, 44)
            }) { (_) -> Void in
                
                // 向上移动
                UIView.animateWithDuration(0.5, delay: 1, options: [], animations: { () -> Void in
                    // 回到原来的位置
                    self.tipLabel.frame = rect
                    }, completion: { (_) -> Void in
                        print("ok")
                })
        }
    }
    
    // 下拉刷新指示器
    private lazy var indicatorView: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
    // 下拉刷题提示标签
    private lazy var tipLabel: UILabel = {
        let l = UIFactory.labelWithText("测试", fontSize: 15, textColor: UIColor.redColor())
        l.backgroundColor = UIColor.orangeColor()
        l.frame = CGRectMake(0, 0, screenWidth, 44)
        return l
    }()
    
}

// UITableView数据源方法
extension HomeTableViewController {

    // Rows
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuses.count
    }
    // Cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
//        // iOS 6.0 以前的写法(淘汰)
//        var cell = tableView.dequeueReusableCellWithIdentifier(homeCellIdentifier)
//        if(cell == nil) {
//            cell = UITableViewCell(style: .Default, reuseIdentifier: homeCellIdentifier)
//        }
        
        // iOS 6.0以后的写法
        let cell = tableView.dequeueReusableCellWithIdentifier(homeCellId, forIndexPath: indexPath) as! StatusCell
        
        let status = statuses[indexPath.row]
        // 把模型数据传递给自定义Cell
        cell.status = status
        
        // 如果滑动到最后一行Cell, 就加载旧数据(静默加载)
        // isAnim用于判断是否已经在加载数据, 防止刷接口的情况出现
        let isAnim = indicatorView.isAnimating()
        if indexPath.row == statuses.count - 1 && !isAnim {
            // 加载数据
            uploadData()
        }
        
        return cell
    }
}

/// 定时刷新
extension HomeTableViewController {
    
    
    @objc private func update() {
        
        // 调用“提醒接口”
        let urlString = "2/remind/unread_count.json"
        let uid = UserAccount.sharedAccount.uid!
        guard let token = UserAccount.sharedAccount.access_token else {
            print("用户未登陆，或者登陆已过期")
            return
        }
        let parameters = ["uid" : uid, "access_token" : token]
        
        HTTPClient.sharedClient.requestJSONDict(.GET, urlString: urlString, parameters: parameters) { (dict, error) -> () in
            
            if error != nil {
                SVProgressHUD.showErrorWithStatus("请求失败！")
                return
            }
            SVProgressHUD.showSuccessWithStatus("请求成功！")
            print(dict)
            let count = dict!["status"]
            print(count!)
        }
        
//        self.tableView.reloadData()
    }
    
}
